package com.killers.cold.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;

/**
 * @author 罗天豪
 * @date 2019/9/5
 */
public class FileUtil {
    /**
     * 文件存储单位
     */
    public static final String FILE_UOM_BYTE = "B";
    public static final String FILE_UOM_KB = "KB";
    public static final String FILE_UOM_MB = "MB";
    public static final String FILE_UOM_GB = "GB";
    /**
     * 文件大小，以B为基准
     */
    public static final long FILE_SIZE_KB = 1024;
    public static final long FILE_SIZE_MB = 1048576;
    public static final long FILE_SIZE_GB = 1073741824;
    /**
     * 文件大小计算的精度设置
     */
    public static final String SIGNIFICANT_DECIMAL = "0.00";

    /**
     * 指定文件名随机字段的来源字符
     */
    public static final String ABC = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    /**
     * 指定文件名的随机字段长度
     */
    public static final int RANDOM_LENGTH = 4;


    /**
     * 生成文件名称，以[T]+[yyyyMMddHHmmss]+[-]+[RANDOM_LENGTH的随机串]为准
     * @return 文件名称
     */
    public static String createFileName() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String yearAndTime = sdf.format(date);

        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < RANDOM_LENGTH; i++) {
            char c = ABC.charAt(random.nextInt(ABC.length()));
            sb.append(c);
        }
        String randomAbc = sb.toString();

        return "T" + yearAndTime + "-" + randomAbc;
    }

    /**
     * 计算文件的大小，以SIGNIFICANT_DECIMAL为基准
     * @param size 文件大小long型
     * @param uom 文件单位对应的数值单位
     * @return 高精度文件大小
     */
    public static BigDecimal calculateFileSize(long size, long uom) {
        DecimalFormat decimalFormat = new DecimalFormat(SIGNIFICANT_DECIMAL);
        String format = decimalFormat.format((float) size / uom);
        return new BigDecimal(format);
    }


    /**
     * 计算文件大小和单位
     * @param size 文件大小
     * @return 包含大小和单位的map
     */
    public static HashMap<String,Object> getFileSizeAndUom(Long size) {
        HashMap<String,Object> map = new HashMap<>();
        //kb
        if (size>FILE_SIZE_KB) {
            //mb
            if (size>FILE_SIZE_MB) {
                //gb
                if (size>FILE_SIZE_GB){
                    map.put("UOM", FILE_UOM_GB);
                    map.put("SIZE", calculateFileSize(size,FILE_SIZE_GB));
                    return map;
                }else {
                    map.put("UOM", FILE_UOM_MB);
                    map.put("SIZE", calculateFileSize(size,FILE_SIZE_MB));
                    return map;
                }
            }else {
                map.put("UOM", FILE_UOM_KB);
                map.put("SIZE", calculateFileSize(size,FILE_SIZE_KB));
                return map;
            }
        }else {
            map.put("UOM", FILE_UOM_BYTE);
            map.put("SIZE", new BigDecimal(size));
            return map;
        }
    }
}
